/******************************************************************************
*@file  : app.c
*@brief : UART Demos 
******************************************************************************/
#include "app.h"
PCOM_HandleTypeDef hpcom;

void HAL_PCOM_MspInit(PCOM_HandleTypeDef* hpcom)
{
    if(hpcom->Instance==PCOM)
    { 
        /* Enable PCOM clock */
        __HAL_RCC_PCOM_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        GPIO_InitTypeDef GPIO_InitStructure = {0};   	
        /* Initialization GPIO */
        /**PCOM GPIO Configuration    
        PA2  ------> PCOM1 
        PA3  ------> PCOM2
        PA6  ------> VBAT
        PB12  ------> OUT
        */
        GPIO_InitStructure.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6;	
        GPIO_InitStructure.Pull=GPIO_NOPULL;
        GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
        GPIO_InitStructure.Drive = GPIO_DRIVE_LEVEL3;
        
        HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        GPIO_InitStructure.Pin = GPIO_PIN_12;	
        GPIO_InitStructure.Pull=GPIO_NOPULL;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
        
        HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
        
    } 
}
void PCOM_Config_INSEL1()
{
    hpcom.Instance=PCOM;
    hpcom.Init.InSel = PCOM_INSEL_INP_SEL_1;
    hpcom.Init.VrefSel = 0xFF;
    hpcom.Init.FltCmd = PCOM_FLTCMD_ENABLE;
    hpcom.Init.FltTime = PCOM_FLTTIME_255_PCLK;
    hpcom.Init.WaitCnt = 0x1ff;
    hpcom.Init.Trim = PCOM_TRIM_FACTORY;

    HAL_PCOM_Init(&hpcom);
    HAL_PCOM_Enable(&hpcom);
    
}

void PCOM_Config_INSEL2()
{
    hpcom.Instance=PCOM;
    hpcom.Init.InSel = PCOM_INSEL_INP_SEL_2;
    hpcom.Init.VrefSel = 0xFF;
    hpcom.Init.FltCmd = PCOM_FLTCMD_ENABLE;
    hpcom.Init.FltTime = PCOM_FLTTIME_255_PCLK;
    hpcom.Init.WaitCnt = 0x1ff;
    hpcom.Init.Trim = PCOM_TRIM_FACTORY;
    
    HAL_PCOM_Init(&hpcom);
    HAL_PCOM_Enable(&hpcom);   
}
void PCOM_Config_INSEL_VBAT()
{
    hpcom.Instance=PCOM;
    hpcom.Init.InSel = PCOM_INSEL_VBAT;
    hpcom.Init.VrefSel = 0xFF;
    hpcom.Init.FltCmd = PCOM_FLTCMD_ENABLE;
    hpcom.Init.FltTime = PCOM_FLTTIME_255_PCLK;
    hpcom.Init.WaitCnt = 0x1ff;
    hpcom.Init.Trim = PCOM_TRIM_FACTORY;
   
    HAL_PCOM_Init(&hpcom);
    HAL_PCOM_Enable(&hpcom);  
}
void PCOM_Result()
{

    if(0 != READ_BIT(hpcom.Instance->SR,PCOM_SR_CMPOUT))
    {
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
    }
    else
    {
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
    }
}
void PCOM_Cal_Input_Vot()
{

    uint32_t left=0,right=255,old_VrefSel,new_VrefSel;
    HAL_PCOM_GetOutputLevel(&hpcom);
    old_VrefSel = hpcom.Init.VrefSel;
    new_VrefSel = hpcom.Init.VrefSel-1;
    while(old_VrefSel != new_VrefSel)
    {
        if(1 == hpcom.OutputLevel)
        {
            left = hpcom.Init.VrefSel;
            hpcom.Init.VrefSel=(left+right)/2;
            MODIFY_REG((hpcom.Instance->TRIM),PCOM_TRIM_VREF_SEL_Msk,hpcom.Init.VrefSel<<PCOM_TRIM_VREF_SEL_Pos);
            HAL_PCOM_WaitDone_Set_ClR(&hpcom);
            HAL_PCOM_WaitDone_Set_ClR(&hpcom);
            HAL_PCOM_WaitDone_Set_ClR(&hpcom);
            HAL_PCOM_GetOutputLevel(&hpcom);
        }
        else if(0 == hpcom.OutputLevel)
        {

            right = hpcom.Init.VrefSel;
            hpcom.Init.VrefSel=(left+right)/2;
            MODIFY_REG((hpcom.Instance->TRIM),PCOM_TRIM_VREF_SEL_Msk,hpcom.Init.VrefSel<<PCOM_TRIM_VREF_SEL_Pos);
            HAL_PCOM_WaitDone_Set_ClR(&hpcom);
            HAL_PCOM_WaitDone_Set_ClR(&hpcom);
            HAL_PCOM_WaitDone_Set_ClR(&hpcom);
            HAL_PCOM_GetOutputLevel(&hpcom);
        }
        old_VrefSel=new_VrefSel;
        new_VrefSel = hpcom.Init.VrefSel;
    }
    HAL_PCOM_Get_Vref_Vol(&hpcom);
    
    if(TEST_SEL == VBAT_SEL)
    {
        printfS("%f\r\n",1.0*3*hpcom.Init.Vref_Vol/PCOM_TIMES);
    }
    else
    {
        printfS("%f\r\n",1.0*hpcom.Init.Vref_Vol/PCOM_TIMES);
    }

}
void APP_Test(enum_TEST_MODE_t fe_Mode)
{
    switch (fe_Mode)
    {

        case INP_SEL1:
            PCOM_Config_INSEL1();
            break;
        case INP_SEL2:
            PCOM_Config_INSEL2();
            break;
        case VBAT_SEL:
            PCOM_Config_INSEL_VBAT();
            break;
        default: break; 
    }

}
